home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 7
/
Amiga Format AFCD07 (Dec 1996, Issue 91).iso
/
serious
/
shareware
/
comms
/
internet
/
html-related
/
hsc
/
source
/
hsclib
/
attrib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-03
|
9KB
|
482 lines
/*
* hsclib/attribute.c
*
* hsc-variable funcs for hsc
*
* Copyright (C) 1995,96 Thomas Aglassinger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* updated: 15-Jul-1996
* created: 2-Sep-1995
*
*/
#define NOEXTERN_HSCLIB_ATTRIBUTE_H
#include "hsclib/inc_base.h"
#include "hsclib/eval.h"
#include "hsclib/uri.h"
/*
*-------------------------------------
* debugging functions
*-------------------------------------
*/
/*
* ptr_var
*/
static VOID prt_var(FILE * stream, APTR data)
{
HSCATTR *var = (HSCATTR *) data;
if (var)
{
int varquote = var->quote;
if (varquote == VQ_NO_QUOTE)
varquote = '.';
/* name & type & macro_id */
fprintf(stream, "%s (type:%u,mci:%lu) ",
var->name, var->vartype, var->macro_id);
/* text value */
if (var->text)
fprintf(stream, "cur:%c%s%c",
var->quote, var->text, varquote);
else
fprintf(stream, "<NULL>");
fprintf(stream, " ");
/* default text */
if (var->deftext)
fprintf(stream, "def:%c%s%c",
var->quote, var->deftext, varquote);
else
fprintf(stream, "<NULL>");
fprintf(stream, "\n");
}
else
fprintf(stream, "<NULL>\n");
}
VOID prt_varlist(DLLIST * varlist, STRPTR title)
{
fprintf(stderr, DHL "%s\n", title);
fprintf_dllist(stderr, varlist, prt_var);
}
/*
*-------------------------------------
* constructor/destructor
*-------------------------------------
*/
/*
* del_hscattr
*
* delete attribute
*/
VOID del_hscattr(APTR data)
{
HSCATTR *var = (HSCATTR *) data;
#if DEBUG_ATTR
fprintf(stderr, DHL " del_attr %s (mci=%d)\n",
var->name, var->macro_id);
#endif
/* release mem */
ufreestr(var->name);
ufreestr(var->deftext);
ufreestr(var->text);
ufreestr(var->enumstr);
var->macro_id = 0;
var->varflag = 0;
var->vartype = VT_NONE;
var->quote = EOF;
ufree(var);
}
/*
* new_hscattr
*
* alloc & init a new variable
*/
HSCATTR *new_hscattr(STRPTR newname)
{
HSCATTR *newvar = (HSCATTR *) umalloc(sizeof(HSCATTR));
#if DEBUG_ATTR
fprintf(stderr, DHL " new_attr %s\n", newname);
#endif
if (newvar)
{
/* init new varument item */
newvar->vartype = VT_NONE;
newvar->name = strclone(newname);
newvar->deftext = NULL;
newvar->text = NULL;
newvar->enumstr = NULL;
newvar->macro_id = 0;
if (upstrncmp(newname, PREFIX_HSCATTR, strlen(PREFIX_HSCATTR)))
newvar->varflag = 0;
else
newvar->varflag = VF_KEEP_QUOTES;
newvar->quote = EOF;
}
if (!(newvar->name))
{
del_hscattr((APTR) newvar);
newvar = NULL;
}
return (newvar);
}
/*
* cpy_hscattr
*
* create copy of an already existing attribute
*/
HSCATTR *cpy_hscattr(HSCATTR * oldvar)
{
HSCATTR *newvar = new_hscattr(oldvar->name);
if (newvar)
{
newvar->vartype = oldvar->vartype;
if (oldvar->deftext)
newvar->deftext = strclone(oldvar->deftext);
if (oldvar->text)
newvar->text = strclone(oldvar->text);
if (oldvar->enumstr)
newvar->enumstr = strclone(oldvar->enumstr);
newvar->macro_id = oldvar->macro_id;
newvar->varflag = oldvar->varflag;
newvar->quote = oldvar->quote;
}
if (!(newvar->name))
{
del_hscattr((APTR) newvar);
newvar = NULL;
}
return (newvar);
}
/*
* app_var
*
* append a new var to the var list AT BEGINNING
*/
HSCATTR *app_var(DLLIST * varlist, STRPTR newname)
{
HSCATTR *var = new_hscattr(newname);
BOOL ok = FALSE;
if (var)
ok = (ins_dlnode(varlist, varlist->first, (APTR) var) != NULL);
if (!ok)
{
del_hscattr((APTR) var);
var = NULL;
}
return (var);
}
/*
*-------------------------------------
* search functions
*-------------------------------------
*/
/*
* cmp_varname
*
* compares a var-name with the name
* of a HSCATTR-entry
*/
int cmp_varname(APTR cmpstr, APTR vardata)
{
STRPTR varstr = NULL;
if (vardata)
varstr = ((HSCATTR *) vardata)->name;
if (varstr)
if (!upstrcmp(cmpstr, varstr))
return (-1);
else
return (0);
else
return (0);
}
/*
* find_attrnode
*/
DLNODE *find_attrnode(DLLIST * varlist, STRPTR name)
{
DLNODE *nd = find_dlnode(varlist->first, (APTR) name, cmp_varname);
return (nd);
}
/*
* find_varname
*/
HSCATTR *find_varname(DLLIST * varlist, STRPTR name)
{
DLNODE *nd = find_dlnode(varlist->first, (APTR) name, cmp_varname);
HSCATTR *var = NULL;
if (nd)
var = (HSCATTR *) nd->data;
return (var);
}
/*
*-------------------------------------
* misc. functions
*-------------------------------------
*/
/*
* set_vartext
*
* set value of a var
*
* params: var......var to set
* newtext..new text to set
* result: value of new text set
* errors: return NULL if out of mem, display error message
*/
STRPTR set_vartext(HSCATTR * var, STRPTR newtext)
{
if (newtext != var->text)
{
ufreestr(var->text);
var->text = NULL;
if (newtext)
var->text = strclone(newtext);
}
return (var->text);
}
/*
* set_varbool
*
* set value of a boolean attr
*
* params: var....var to set
* value..new value to set
* result: value
* errors: if out of mem, display error message
*/
BOOL set_varbool(HSCATTR * attr, BOOL value)
{
if (value)
set_vartext(attr, attr->name);
else
set_vartext(attr, "");
return (value);
}
/*
* clr_vartext
*
* clear or reset var to default text
*
* params: var..var to clear
* result: TRUE, if new value set correctly
*/
BOOL clr_vartext(HSCATTR * var)
{
BOOL ok = TRUE;
if (var->deftext)
{
if (!(set_vartext(var, var->deftext)))
ok = FALSE;
}
else
{
ufreestr(var->text);
var->text = NULL;
}
return (ok);
}
/*
* clr_attrdef
*
* clear attributes default text
*
* params: attr..attr to clear
*/
VOID clr_attrdef(HSCATTR * attr)
{
ufreestr(attr->deftext);
attr->deftext = NULL;
}
/*
* clr_varlist
*
* clear all vars to default text
*
* params: varlist..varlist to clear
*/
BOOL clr_varlist(DLLIST * varlist)
{
DLNODE *nd = varlist->first;
BOOL ok = TRUE;
while (nd && ok)
{
ok &= clr_vartext((HSCATTR *) nd->data);
nd = nd->next;
}
return (ok);
}
/*
* clr_varlist_bool
*
* set all "empty" (=NULL) boolean attributes of
* an attr list to FALSE
*
* params: varlist..varlist to process
*/
VOID clr_varlist_bool(DLLIST * varlist)
{
DLNODE *nd = varlist->first;
BOOL ok = TRUE;
while (nd && ok)
{
HSCATTR *attr = (HSCATTR *) nd->data;
if ((attr->vartype == VT_BOOL) && !(attr->text))
set_varbool(attr, FALSE);
nd = nd->next;
}
}
/*
* get_vartext_byname: get text value of a var
*
*
*/
STRPTR get_vartext_byname(DLLIST * varlist, STRPTR name)
{
HSCATTR *var = find_varname(varlist, name);
STRPTR vartext = NULL;
if (var)
vartext = var->text;
return (vartext);
}
/*
* get_vartext: get text value of a var
*
*/
STRPTR get_vartext(HSCATTR * var)
{
STRPTR text = NULL;
if (var)
text = var->text;
return (text);
}
/*
* get_varbool: get value of a boolean attr
*/
BOOL get_varbool(HSCATTR * attr)
{
BOOL set = FALSE;
if (attr && (attr->text[0]))
set = TRUE;
return (set);
}
/*
* get_varbool_byname: get value of a boolean attr
*/
BOOL get_varbool_byname(DLLIST * varlist, STRPTR name)
{
HSCATTR *var = find_varname(varlist, name);
return (get_varbool(var));
}
/*
* get_varnum: get value of a numeric attr
*/
LONG get_varnum(HSCATTR * attr)
{
LONG num = 0;
if (attr && (attr->text) && (attr->text[0]))
str2long(attr->text, &num);
return (num);
}
/*
* get_varnum_byname: get value of a numeric attr
*/
LONG get_varnum_byname(DLLIST * varlist, STRPTR name)
{
HSCATTR *var = find_varname(varlist, name);
return (get_varnum(var));
}
/*
* get_vardeftext: get default text value of a var
*
*/
STRPTR get_vardeftext(HSCATTR * var)
{
STRPTR deftext = NULL;
if (var)
deftext = var->deftext;
return (deftext);
}